package properties;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import springfox.documentation.swagger.web.DocExpansion;
import springfox.documentation.swagger.web.ModelRendering;
import springfox.documentation.swagger.web.OperationsSorter;
import springfox.documentation.swagger.web.TagsSorter;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义启动Swagger2注解
 *
 * @original_author: 翟永超 http://blog.didispace.com
 * @editer YoCiyy
 * @date: 2020/5/28
 */
@Data
@ConfigurationProperties(prefix = "yoci.swagger")
public class Swagger2Properties {
	/** 是否开启Swagger2 */
	private Boolean enabled;

	/** 文档标题 */
	private String title = "";

	/** 描述 */
	private String description = "";

	/** 版本 */
	private String version = "";

	/** 许可证 */
	private String license = "";

	/** 许可证URL */
	private String licenseUrl = "";

	/** 服务条款URL */
	private String termsOfServiceUrl = "";

	/** 服务器IP */
	private String host = "";

	/** 联系人信息配置 */
	private Contact contact = new Contact();

	/** 页面功能配置 */
	private UiConfig uiConfig = new UiConfig();

	/** swagger会解析的包路径 */
	private String basePackage = "";

	/** swagger会解析的url规则 */
	private List<String> basePath = new ArrayList<>();

	/** 在basePath基础上需要排除的url规则 */
	private List<String> excludePath = new ArrayList<>();

	/** 全局统一鉴权配置 */
	private Authorization authorization = new Authorization();

	/** 联系人信息参数 */
	@Data
	@NoArgsConstructor
	public static class Contact {

		/** 联系人 */
		private String name = "";

		/** 联系人url */
		private String url = "";

		/** 联系人email */
		private String email = "";
	}

	@Data
	@NoArgsConstructor
	public static class UiConfig {

		/** 对Api/tags列表进行排序 */
		private String apisSorter = "alpha";

		/** 启用复杂视图编辑器 默认为false */
		private Boolean jsonEditor = false;

		/** 是否显示请求头信息 swagger默认为false,yoci自定义封装默认打开为true */
		private Boolean showRequestHeaders = true;

		/** 支持页面提交的请求类型， */
		private String[] submitMethods = { "get", "post", "put", "delete", "patch" };

		/** 请求超时时间 */
		private Long requestTimeout = 10000L;

		/** 启用标记和操作的深层链接 默认为fales */
		private Boolean deepLinking = false;
		/** 是否显示操作列表ID 默认为false */
		private Boolean displayOperationId = false;
		/** 模型的默认扩展深度（设置为-1将完全隐藏模型） */
		private Integer defaultModelsExpandDepth;
		private Integer defaultModelExpandDepth;
		private ModelRendering defaultModelRendering;

		/** 是否显示请求耗时，默认false */
		private Boolean displayRequestDuration = true;

		/** 可选 none | list */
		private DocExpansion docExpansion;

		/** Boolean=false OR String */
		private Object filter;
		private Integer maxDisplayedTags;
		private OperationsSorter operationsSorter;
		private Boolean showExtensions;
		private TagsSorter tagsSorter;

		/** Network */
		private String validatorUrl;
	}

	/** securitySchemes 支持方式之一 ApiKey */
	@Data
	@NoArgsConstructor
	public static class Authorization {

		/** 鉴权策略ID，对应 SecurityReferences ID */
		private String name = "Authorization";

		/** 鉴权策略，可选 ApiKey | BasicAuth | None，默认ApiKey */
		private String type = "ApiKey";

		/** 鉴权传递的Header参数 */
		private String keyName = "TOKEN";

		/** 需要开启鉴权URL的正则 */
		private String authRegex = "^.*$";
	}

}
